Health Outcomes and CO₂ Emissions#

With the data prepared, we now present three visualizations supporting each perspective. Each visualization is accompanied by a brief insight and an explanation linking it to the respective argument.

Perspective 1:#

Do Higher CO₂ Emissions Shorten Healthy Lifespans? This perspective expects to see negative correlations or warning signs that pollution from CO₂ emissions adversely affects health. We look for evidence that countries with higher emissions have lower healthy life expectancy, or that rapid emission growth is associated with stagnating health outcomes.

Global patterns#

CO₂ per Capita vs Healthy Life Expectancy (2019) – Is higher carbon output linked to lower healthy life expectancy?

Hide code cell source
import pandas as pd
import plotly.express as px
from IPython.display import HTML

# 1. Data inladen
co2 = pd.read_csv("owid-co2-data.csv", usecols=["country", "year", "co2_per_capita"])
who = (
    pd.read_csv("C64284D_ALL_LATEST.csv")
      .query("IND_NAME=='Healthy life expectancy (at birth)' & DIM_GEO_CODE_TYPE=='COUNTRY'")
      .loc[:, ["GEO_NAME_SHORT", "DIM_TIME", "AMOUNT_N"]]
      .rename(columns={"GEO_NAME_SHORT":"country", "DIM_TIME":"year", "AMOUNT_N":"LifeExp"})
)
co2["year"] = co2["year"].astype(int)
who["year"] = who["year"].astype(int)

# 2. Merge data
df = (
    pd.merge(co2, who, on=["country", "year"], how="inner")
      .dropna(subset=["co2_per_capita", "LifeExp"])
)

# 3. CO₂-quartiles in English
df["CO2_quartile"] = pd.qcut(
    df["co2_per_capita"],
    4,
    labels=["Low", "Low-medium", "Medium-high", "High"]
)

# 4. Boxplot maken met Engelse labels en default kleuren
fig = px.box(
    df,
    x="CO2_quartile",
    y="LifeExp",
    points="all",
    title="Healthy Life Expectancy by CO₂ Emissions Quartile",
    labels={
        "CO2_quartile": "CO₂ Emissions Quartile",
        "LifeExp": "Healthy Life Expectancy (years)"
    },
    color="CO2_quartile"
)

# 5. Legend wit maken, container beige, plot-area wit
fig.update_layout(
    paper_bgcolor='#FFF3D4',      # container beige
    plot_bgcolor='white',         # plot-area wit
    font=dict(family='Arial, sans-serif', color='#2C2C2C'),
    title_font=dict(size=20, color='#2C2C2C'),
    xaxis=dict(showgrid=False),
    yaxis=dict(showgrid=True, gridcolor='rgba(0,0,0,0.1)'),
    legend=dict(
        bgcolor='white',         # legend‐achtergrond wit
        bordercolor='#2C2C2C',
        borderwidth=1
    )
)

# 6. Embed als HTML-snippet
html_snippet = fig.to_html(include_plotlyjs="cdn", full_html=False)
display(HTML(html_snippet))

Caption:
This box plot shows the distribution of healthy life expectancy for countries grouped by CO₂ emissions per capita quartile in 2019. Points represent individual countries, and the box spans the interquartile range with the median marked. Notice that the median life expectancy does not steadily decline from the lowest to the highest quartile, and there’s considerable overlap between groups.

Insight:
Globally, higher per-capita CO₂ emissions do not translate into lower healthy life expectancy. For example, Qatar (in the “high” quartile) emits over 30 tons of CO₂ per person yet enjoys a median healthy lifespan of about 73 years well above the global average (WHO, n.d.). In contrast, Niger (in the “low” quartile) emits under 1 ton per person and has a healthy life expectancy near 60 years. This suggests that economic development, healthcare systems, and other social factors dominate health outcomes (Deaton, 2003; Rosling, Rosling, & Rönnlund, 2018). While CO₂ can impact local air quality and population health, especially in urbanized areas, the global pattern is better explained by developmental factors than by a direct emissions-to-health effect (Greenstone & Fan, 2021).

Country case comparison#

– Case comparison of a high emitter vs. a low emitter vs. a moderate emitter.

Hide code cell source
import pandas as pd
import numpy as np
import plotly.graph_objects as go
import plotly.io as pio
from IPython.display import HTML, display

# 1 Renderer instellen voor inline weergave
pio.renderers.default = "notebook"

# 2 Data inladen
co2 = pd.read_csv(
    'owid-co2-data.csv',
    usecols=['country','year','co2_per_capita']
)
hale = pd.read_csv('C64284D_ALL_LATEST.csv')

# 3 Healthy life expectancy filter & renamen
hale = (
    hale.loc[
        (hale['IND_NAME']=='Healthy life expectancy (at birth)') &
        (hale['DIM_SEX']=='TOTAL'),
        ['GEO_NAME_SHORT','DIM_TIME','AMOUNT_N']
    ]
    .rename(columns={
        'GEO_NAME_SHORT':'country',
        'DIM_TIME':'year',
        'AMOUNT_N':'healthy_life_expectancy'
    })
)
co2['year']  = co2['year'].astype(int)
hale['year'] = hale['year'].astype(int)

# 4 Harmoniseer landnaam en merge voor 2019
co2['country'] = co2['country'].replace({
    'United States':'United States of America'
})
merged = pd.merge(co2, hale, on=['country','year'], how='inner')
df2019 = (
    merged[merged['year']==2019]
    .dropna(subset=['co2_per_capita','healthy_life_expectancy'])
)

# 5 Specifieke landen in de juiste volgorde
countries = ['United States of America','France','India']
df3 = df2019.set_index('country').loc[countries]

# 6 X-positie en barbreedte bepalen
x = np.arange(len(countries))
width = 0.35

# 7 Groepeerde barplot bouwen
fig = go.Figure()

# kleuren uit het logo
color_co2 = '#FBBF24'       # aarde-geel
color_life = '#3B82F6'      # aardbol-blauw
text_color = '#2C2C2C'      # zwart voor tekst
bg_color = '#FFF3D4'        # light beige

# CO₂ per Capita (linker y-as)
fig.add_trace(go.Bar(
    x=x - width/2,
    y=df3['co2_per_capita'],
    name='CO₂ per Capita (tons)',
    marker_color=color_co2,
    marker_line_width=1,
    marker_line_color='black',
    hovertemplate='CO₂: %{y:.2f} ton<extra></extra>',
    yaxis='y1'
))

# Healthy Life Expectancy (rechter y-as)
fig.add_trace(go.Bar(
    x=x + width/2,
    y=df3['healthy_life_expectancy'],
    name='Healthy Life Expectancy (years)',
    marker_color=color_life,
    marker_line_width=1,
    marker_line_color='black',
    hovertemplate='Gezonde levensverwachting: %{y:.1f} jaar<extra></extra>',
    yaxis='y2'
))

# 8 Layout met styling uit logo en zwarte as-teksten
fig.update_layout(
    title="Emissions vs Healthy Life Expectancy: U.S. vs France vs India (2019)",
    paper_bgcolor='#FFF3D4',               # container blijft wit
    plot_bgcolor='white',              # **tabel** krijgt beige
    font=dict(
        family='Arial, sans-serif',
        color=text_color
    ),
    title_font=dict(
        size=20,
        color=text_color
    ),
    xaxis=dict(
        tickmode='array',
        tickvals=x,
        ticktext=countries,
        tickangle=15,
        title=dict(text='Country', font=dict(color=text_color)),
        tickfont=dict(color=text_color),
        showgrid=False
    ),
    yaxis=dict(
        title=dict(text='CO₂ per Capita (tons)', font=dict(color=text_color)),
        tickfont=dict(color=text_color),
        showgrid=True,
        gridcolor='rgba(0,0,0,0.1)'
    ),
    yaxis2=dict(
        title=dict(text='Healthy Life Expectancy (years)', font=dict(color=text_color)),
        tickfont=dict(color=text_color),
        overlaying='y',
        side='right',
        showgrid=False
    ),
    legend=dict(
        orientation='h',
        yanchor='bottom',
        y=1.02,
        x=0.5,
        xanchor='center'
    ),
    bargap=0.2,
    margin=dict(t=80, b=50, l=60, r=60)
)

# 9 HTML-snippet maken zonder full_html
html_snippet = fig.to_html(include_plotlyjs='cdn', full_html=False)

# 10 Alleen de interactieve plot renderen
display(HTML(html_snippet))

Caption: This bar chart contrasts CO₂ emissions per capita (left axis, orange bars) with healthy life expectancy (right axis, blue bars) for three example countries in 2019. The United States emits far more CO₂ per person (≈15 tons) than France (≈5 tons) or India (<2 tons). Yet, Americans have a shorter healthy life expectancy (~66 years) than the French (~72 years). Indians have a much lower healthy lifespan (~60 years) alongside very low emissions.

Insight: The comparison highlights that more emissions do not guarantee better health. The U.S. vs France gap is telling: Americans emit about 3× more CO₂ per capita, but enjoy roughly 6 fewer healthy years on average than the French. This could be due to pollution or other lifestyle and healthcare differences. Perspective 1 would note that high emissions often accompanied by air pollution and greenhouse effects might be undermining health in the U.S., which struggles with issues like air quality and chronic disease (Greenstone & Fan, 2021; World Bank & Institute for Health Metrics and Evaluation, 2020). Meanwhile, India shows the opposite extreme: very low emissions come with low healthy life expectancy, primarily due to poverty and limited healthcare access, not emissions themselves (Deaton, 2003). While India’s low emissions are not causing poor health, perspective 1 advocates worry that as India’s emissions rise, environmental health burdens (e.g., smog in cities) could further challenge its progress (Watts et al., 2023). This case study suggests that beyond a certain point, increasing emissions may be associated with diminishing health returns. France achieves higher health outcomes with lower emissions than the U.S., aligning with the idea that cleaner development paths might support longer healthy lives (Rosling et al., 2018).

China’s development and air quality#

– Does rapid emission growth slow health progress?

Hide code cell source
import pandas as pd
import plotly.graph_objects as go
import plotly.io as pio
from IPython.display import HTML, display

# Renderer instellen voor inline weergave
pio.renderers.default = 'notebook'

# 1) Data inladen
co2 = pd.read_csv('owid-co2-data.csv', usecols=['country', 'year', 'co2_per_capita'])
hale = pd.read_csv('C64284D_ALL_LATEST.csv')

# 2) Healthy life expectancy filter & rename
hale = (
    hale.loc[
        (hale['IND_NAME'] == 'Healthy life expectancy (at birth)') &
        (hale['DIM_SEX'] == 'TOTAL'),
        ['GEO_NAME_SHORT', 'DIM_TIME', 'AMOUNT_N']
    ]
    .rename(columns={
        'GEO_NAME_SHORT': 'country',
        'DIM_TIME': 'year',
        'AMOUNT_N': 'healthy_life_expectancy'
    })
)

# 3) Year als int en filter China 2000–2021
co2['year'] = co2['year'].astype(int)
hale['year'] = hale['year'].astype(int)
china = pd.merge(
    co2.query("country == 'China' and 2000 <= year <= 2021"),
    hale.query("country == 'China' and 2000 <= year <= 2021"),
    on=['country', 'year']
).sort_values('year')

# 4) Bouw de interactieve Plotly-figuur met dubbele y-as
fig = go.Figure()

# CO₂ per Capita (links) - nu blauw
fig.add_trace(go.Scatter(
    x=china['year'], 
    y=china['co2_per_capita'],
    name='CO₂ per Capita (tons)',
    mode='lines+markers',
    marker=dict(color='blue'),
    line=dict(color='blue'),
    yaxis='y1'
))

# Healthy Life Expectancy (rechts) - nu oranje
fig.add_trace(go.Scatter(
    x=china['year'], 
    y=china['healthy_life_expectancy'],
    name='Healthy Life Expectancy (years)',
    mode='lines+markers',
    marker=dict(color='orange'),
    line=dict(color='orange'),
    yaxis='y2'
))

# 5) Styling: plot-area beige, container wit, transparante legenda
fig.update_layout(
    title='China: Trend of CO₂ per Capita and Healthy Life Expectancy (2000–2021)',
    paper_bgcolor='#FFF3D4',               # container wit
    plot_bgcolor='white',              # plot-area beige
    font=dict(family='Arial, sans-serif', color='#2C2C2C'),
    title_font=dict(size=20, color='#2C2C2C'),
    xaxis=dict(
        title='Year',
        showgrid=False,
        tickfont=dict(color='#2C2C2C'),
        title_font=dict(color='#2C2C2C')
    ),
    yaxis=dict(
        title=dict(text='CO₂ per Capita (tons)', font=dict(color='#2C2C2C')),
        tickfont=dict(color='#2C2C2C'),
        showgrid=True,
        gridcolor='rgba(0,0,0,0.1)'
    ),
    yaxis2=dict(
        title=dict(text='Healthy Life Expectancy (years)', font=dict(color='#2C2C2C')),
        tickfont=dict(color='#2C2C2C'),
        overlaying='y',
        side='right',
        showgrid=False
    ),
    legend=dict(
        orientation='h',
        y=1.02,
        x=0.5,
        xanchor='center',
        bgcolor='rgba(0,0,0,0)',        # transparante achtergrond
        bordercolor='rgba(0,0,0,0)'     # transparante rand
    )
)

# 6) HTML-snippet genereren en direct renderen
html_snippet = fig.to_html(include_plotlyjs='cdn', full_html=False)
display(HTML(html_snippet))

Caption: This line chart shows China’s CO₂ emissions per capita (orange line, in tons) and healthy life expectancy at birth (blue line, in years) from 2000 to 2021. China’s CO₂ per person surged dramatically (more than tripling over two decades), while healthy life expectancy also rose steadily (from about 62 up to ~68 years).

Insight: China illustrates a complex story. Despite severe pollution challenges during its rapid industrialization, healthy life expectancy still improved significantly as the country became wealthier. There isn’t an obvious dip or slowdown in the upward health trend corresponding to rising emissions in fact, both lines climb upward. Advocates of Perspective 1, however, argue that China’s health gains could have been even greater without the heavy air pollution that accompanied its coal-driven economic boom (Greenstone & Fan, 2021; Watts et al., 2023). In the 2010s, in response to these issues, China implemented clean air policies. Noticeably, the curve of CO₂ per capita leveled off slightly toward 2019, and pollution levels in cities began to decline, which may help future health outcomes (World Bank & IHME, 2020).

This example underscores that while high emissions haven’t stopped health improvements outright, they likely impose hidden costs: respiratory illnesses, environmental stress, and fewer healthy years than might be possible in a cleaner environment (Greenstone & Fan, 2021). The full negative impact of emissions might also emerge over the long term through climate change and is not fully captured in this 20-year window (Watts et al., 2023). Overall, the data for Perspective 1 shows that excessive emissions and pollution can correlate with health drawbacks, but the relationship is complex and often outweighed by socioeconomic progress.

Perspective 2:#

Is Development the Real Driver of Health?

This perspective argues that economic development,not CO₂ emissions, is the primary factor behind improvements in healthy life expectancy. While growing emissions sometimes accompany industrialization, it is the resulting investments in healthcare, education, nutrition, and infrastructure that truly extend healthy lifespans. From this view, higher emissions are a byproduct of progress, not a cause of poor health. We look for evidence that countries with high emissions also have strong health outcomes due to their advanced development, and that improvements in life expectancy can occur even as emissions rise or fall so long as healthcare systems and living conditions improve.

Historic emissions and health#

Do countries that industrialized (high historic emissions) have longer healthy lives?

Hide code cell source
import re
import pandas as pd
import plotly.express as px
import plotly.io as pio
from IPython.display import HTML, display
import pycountry

# Renderer voor inline weergave
pio.renderers.default = 'notebook'

# 1) Data inladen
co2 = pd.read_csv(
    'owid-co2-data.csv',
    usecols=['iso_code','country','year','co2_per_capita','cumulative_co2']
)
hale = pd.read_csv('C64284D_ALL_LATEST.csv')

# 2) Filter & rename HLE
hale = (
    hale.loc[
        (hale['IND_NAME']=='Healthy life expectancy (at birth)') &
        (hale['DIM_SEX']=='TOTAL'),
        ['GEO_NAME_SHORT','DIM_TIME','AMOUNT_N']
    ]
    .rename(columns={
        'GEO_NAME_SHORT':'country',
        'DIM_TIME':'year',
        'AMOUNT_N':'healthy_life_expectancy_at_birth'
    })
)
hale['year'] = hale['year'].astype(int)

# 3) Kies jaren
years = [2000, 2010, 2015, 2019, 2021]
co2['year'] = co2['year'].astype(int)
co2 = co2[co2['year'].isin(years)]
hale = hale[hale['year'].isin(years)]

# 4) Filter geldige ISO3
co2 = co2[co2['iso_code'].str.len()==3]

# 5) Maak lookup voor OWID country → iso_code
lookup = (
    co2[['country','iso_code']]
    .drop_duplicates()
    .rename(columns={'country':'owid_country'})
)

# 6) Strip haakjes uit WHO-country en merge
hale['country_clean'] = hale['country'].str.replace(r"\s*\(.*\)$","", regex=True)
hale_iso = (
    hale
    .merge(lookup, left_on='country_clean', right_on='owid_country', how='inner')
    [['iso_code','year','country_clean','healthy_life_expectancy_at_birth']]
    .rename(columns={'country_clean':'country'})
)

# 7) Merge CO₂ + HLE
merged_df = pd.merge(
    co2, hale_iso,
    on=['iso_code','year'],
    how='inner'
).rename(columns={'country_x':'country'})

# 8) Plot voor 2019 met bubbles
fig = px.scatter(
    merged_df[merged_df['year']==2019],
    x='cumulative_co2',
    y='healthy_life_expectancy_at_birth',
    hover_name='country',
    log_x=True,
    size='co2_per_capita',
    color='healthy_life_expectancy_at_birth',
    color_continuous_scale=['#FBBF24','#3B82F6'],
    size_max=30,
    labels={
        'cumulative_co2': 'Cumulative CO₂ Emissions (tonnes, log scale)',
        'healthy_life_expectancy_at_birth': 'Healthy Life Expectancy (years)'
    },
    title='Historical CO₂ Emissions vs Healthy Life Expectancy (2019)'
)
# zwarte rand om elk bolletje
fig.update_traces(marker=dict(line=dict(color='black', width=0.5)))

# 9) Styling: omgeving beige, plot wit, tekst zwart, omlijsting
fig.update_layout(
    paper_bgcolor='#FFF3D4',
    plot_bgcolor='white',
    font=dict(family='Arial, sans-serif', color='#2C2C2C'),
    title_font=dict(size=20, color='#2C2C2C'),
    xaxis=dict(
        title=dict(text='Cumulative CO₂ Emissions (tonnes, log scale)', font=dict(color='#2C2C2C')),
        tickfont=dict(color='#2C2C2C'),
        showgrid=True, gridcolor='rgba(0,0,0,0.1)'
    ),
    yaxis=dict(
        title=dict(text='Healthy Life Expectancy (years)', font=dict(color='#2C2C2C')),
        tickfont=dict(color='#2C2C2C'),
        showgrid=True, gridcolor='rgba(0,0,0,0.1)'
    ),
    legend=dict(
        title_text='Life Expectancy',
        orientation='h', y=1.02, x=0.5, xanchor='center'
    ),
    shapes=[dict(
        type='rect', xref='paper', yref='paper',
        x0=0, y0=0, x1=1, y1=1,
        line=dict(color='black', width=1),
        fillcolor='rgba(0,0,0,0)'
    )]
)

# 10) HTML-snippet genereren (alleen div+script) en renderen in beige container
html_snippet = fig.to_html(include_plotlyjs='cdn', full_html=False)
display(HTML(f"""
<div style="background-color:#FFF3D4; padding:10px;">
  {html_snippet}
</div>
"""))

Caption:#

This 2019 bubble chart compares each country’s cumulative CO₂ emissions (tonnes, log scale) on the x-axis with its healthy life expectancy (years) on the y-axis. Countries with the highest historical emissions generally have a healthy lifespan above 70 years, while low-emission countries cluster around the mid-50s.

Insight: This chart reveals a strong positive association: nations that have emitted the most CO₂ over history, typically more developed economies, almost all have higher healthy life expectancies (70+ years). For instance, countries like Japan, Germany, the UK, or the U.S. (far right) have among the longest healthy lifespans. On the other hand, countries with lower historical emissions (far left) are generally those with shorter healthy lives (often under 60 years). This does not mean emitting CO₂ causes people to live longer; rather, it indicates that industrialization and development which inevitably came with CO₂ emissions enabled better health outcomes (Deaton, 2003; Rosling et al., 2018). In other words, wealth and infrastructure correlate with both high emissions and high life expectancy. This aligns with Perspective 2: healthy longevity is achieved through improved hospitals, nutrition, education, and living conditions, which have historically been financed by the economic growth that also drove up emissions (World Bank & IHME, 2020). The implication is that life expectancy can rise alongside emissions if development is occurring, and that cutting emissions need not reduce life expectancy as long as development and healthcare are maintained.

Health and CO₂ over time#

– How have emissions and health evolved together from 2000 to 2021?

Hide code cell source
import re
import pandas as pd
import plotly.express as px
import plotly.io as pio
from IPython.display import HTML, display
import pycountry

# 1 Renderer voor inline weergave in Jupyter Notebook
pio.renderers.default = 'notebook'

# 2 WHO Healthy Life Expectancy inladen en filteren
who_df = pd.read_csv('C64284D_ALL_LATEST.csv')
who_df = who_df.loc[
    (who_df['IND_NAME'] == 'Healthy life expectancy (at birth)') &
    (who_df['DIM_GEO_CODE_TYPE'] == 'COUNTRY'),
    ['GEO_NAME_SHORT', 'DIM_TIME', 'AMOUNT_N']
].rename(columns={
    'GEO_NAME_SHORT': 'country',
    'DIM_TIME': 'year',
    'AMOUNT_N': 'healthy_life_expectancy_at_birth'
})
who_df['year'] = who_df['year'].astype(int)

# 3 Schoonmaken: verwijder haakjes uit WHO-landennamen
who_df['country_clean'] = who_df['country'].str.replace(r"\s*\(.*\)$", "", regex=True)

# 4 ISO3-code lookup via pycountry
def iso3(name):
    try:
        return pycountry.countries.lookup(name).alpha_3
    except:
        return None

who_df['iso_code'] = who_df['country_clean'].apply(iso3)

# 5 Verwijder rijen zonder geldige ISO3-code
who_iso = who_df.dropna(subset=['iso_code'])[
    ['iso_code', 'year', 'country_clean', 'healthy_life_expectancy_at_birth']
]

# 6 OWID CO₂ per capita inladen
co2_df = pd.read_csv(
    'owid-co2-data.csv',
    usecols=['iso_code', 'year', 'co2_per_capita']
)
co2_df['year'] = co2_df['year'].astype(int)

# 7 Merge WHO en CO₂ data
merged_df = pd.merge(
    co2_df,
    who_iso,
    on=['iso_code', 'year'],
    how='inner'
)

# 8 Plotly scatter-animatie maken
fig = px.scatter(
    merged_df,
    x='co2_per_capita',
    y='healthy_life_expectancy_at_birth',
    animation_frame='year',
    animation_group='country_clean',
    hover_name='country_clean',
    range_x=[0, 35],
    range_y=[40, 85],
    labels={
        'co2_per_capita': 'CO₂ per Capita (t/person)',
        'healthy_life_expectancy_at_birth': 'Healthy Life Expectancy (years)'
    },
    title='Emissions vs Healthy Life Expectancy (2000–2021)'
)

# 8.1 Achtergrondkleur instellen
fig.update_layout(
    paper_bgcolor='#FFF3D4',
    plot_bgcolor='white',
)

# 8.2 Dunnere, zwarte assen- en gridlijnen
fig.update_xaxes(
    showline=True, linecolor='black', linewidth=0.5,
    gridcolor='rgba(0,0,0,0.1)', zerolinecolor='black', zerolinewidth=0.5
)
fig.update_yaxes(
    showline=True, linecolor='black', linewidth=0.5,
    gridcolor='rgba(0,0,0,0.1)', zerolinecolor='black', zerolinewidth=0.5
)

# 8.3 Vertraag animatie naar 1s per frame
fig.layout.updatemenus[0].buttons[0].args[1]['frame']['duration'] = 1000
fig.layout.updatemenus[0].buttons[0].args[1]['transition']['duration'] = 1000
fig.layout.sliders[0].transition.duration = 1000

# 9 HTML-snippet genereren (div+script)
html_snippet = fig.to_html(
    include_plotlyjs='cdn',
    full_html=False
)

# 10 Grafiek renderen
display(HTML(html_snippet))

Caption: This interactive bubble chart (select the play button) shows countries moving from 2000 to 2021. Bubbles typically drift upwards and to the right over time, meaning both CO₂ emissions per capita and healthy life expectancy have increased in tandem for many countries.

Insight: The animation reinforces that in the last two decades, life expectancy improvements often coincided with rising emissions. Developing countries (with lower starting health and emissions) move markedly up-right: for example, India and Bangladesh start near the bottom-left in 2000 (low emissions, ~50s HALE) and progress upward by 2019 (somewhat higher emissions, HALE in 60s) (WHO, n.d.). China’s bubble shoots to the right (big emission surge) and also climbs upward (HALE from low 60s to high 60s). Most high-income countries were already in the upper-right and tend to inch further up (health gains) even as their emissions per capita plateau or decline slightly (Rosling et al., 2018). Notably, European countries have modest or falling CO₂ per capita but still improve health to around 70+ healthy years, showing that it’s possible to gain in health while curbing emissions. The overall picture supports Perspective 2: there is no general trade-off where increasing emissions universally lowers life expectancy if anything, countries have managed to raise healthy life expectancy substantially despite higher emissions. This suggests that improving medical care, sanitation, education, and incomes (which often come with industrial growth) has a more immediate and powerful effect on health than the hypothesized negative effects of CO₂ (Deaton, 2003). Of course, this does not mean CO₂-driven climate change has no future health impact (Watts et al., 2023); rather, up to 2021, socioeconomic progress appears to outweigh any direct life expectancy harms from emissions.

Global inequality in emissions vs health#

– Who has high emissions, and who lives long and healthy?

Hide code cell source
import re
import pandas as pd
import plotly.express as px
import plotly.io as pio
from IPython.display import HTML, display
import pycountry

# 1 Renderer voor inline weergave
pio.renderers.default = 'notebook'

# 2 WHO Healthy Life Expectancy inladen & filteren
who_df = pd.read_csv('C64284D_ALL_LATEST.csv')
who_df = who_df.loc[
    (who_df['IND_NAME']=='Healthy life expectancy (at birth)') &
    (who_df['DIM_GEO_CODE_TYPE']=='COUNTRY'),
    ['GEO_NAME_SHORT','DIM_TIME','AMOUNT_N']
].rename(columns={
    'GEO_NAME_SHORT':'country',
    'DIM_TIME':'year',
    'AMOUNT_N':'healthy_life_expectancy_at_birth'
})
who_df['year'] = who_df['year'].astype(int)

# 3 Schoonmaken: strip parenthesen uit WHO-landennamen
who_df['country_clean'] = who_df['country'].str.replace(r"\s*\(.*\)$","", regex=True)

# 4 ISO-lookup via pycountry
def iso3(name):
    try:
        return pycountry.countries.lookup(name).alpha_3
    except:
        return None

who_df['iso_code'] = who_df['country_clean'].apply(iso3)

# 5 Drop rijen zonder geldige ISO3
who_df = who_df.dropna(subset=['iso_code'])

# 6 OWID CO₂ per capita inladen
co2_df = pd.read_csv('owid-co2-data.csv', usecols=['iso_code','year','co2_per_capita'])
co2_df['year'] = co2_df['year'].astype(int)

# 7 Merge op iso_code + year
merged = pd.merge(co2_df, who_df, on=['iso_code','year'], how='inner')

# 8 Plot voor 2019
fig = px.scatter_geo(
    merged[merged['year']==2019],
    locations='iso_code',
    color='healthy_life_expectancy_at_birth',
    size='co2_per_capita',
    hover_name='country_clean',
    projection='natural earth',
    title='Healthy Life Expectancy & CO₂-uitstoot per persoon (2019)'
)

# 9 Maak land en oceaan wit, en de rest beige
fig.update_geos(
    showcountries=True, countrycolor='black',
    showland=True, landcolor='white',
    showocean=True, oceancolor='white',
    showlakes=False, showrivers=False,
    bgcolor='#FFF3D4'          # <— deze regel kleurt ook de “binnenkant” van de geo beige
)

fig.update_layout(
    paper_bgcolor='#FFF3D4',
    plot_bgcolor='#FFF3D4',
    font=dict(family='Arial, sans-serif', color='#2C2C2C'),
    title_font=dict(size=20, color='#2C2C2C'),
    legend=dict(
        title_text='Healthy Life Expectancy',
        orientation='h', y=1.02, x=0.5, xanchor='center',
        bgcolor='white', bordercolor='#2C2C2C', borderwidth=1
    )
)

# 10 Renderen
fig.show()

Caption: In this world map, bubble size represents CO₂ emissions per capita and color represents healthy life expectancy (yellow-orange = longer healthy lives, blue-purple = shorter healthy lives). We see large bubbles concentrated in North America, the Middle East, and parts of Asia/Oceania (indicating high per-person emissions), whereas small bubbles cover most of Africa and South Asia (minimal emissions). Crucially, many large bubbles are colored blue/purple – for example, the US, Canada, Australia, and Gulf states have high HALE (~65–75 years) despite high emissions. In contrast, the smallest bubbles (low emitters) in sub-Saharan Africa are often yellowish, showing low healthy life expectancy (50s).

Insight: This global view underscores that long healthy lives are achieved across a range of emission levels, and the worst health outcomes are mostly in low-emission, low-income countries. High emissions per capita are primarily a feature of wealthy nations and oil producers. These countries generally have the infrastructure for high life expectancy (though not always the very highest: e.g., the USA’s HALE is lower than some lower-emission European countries) (Rosling, Rosling, & Rönnlund, 2018). Meanwhile, countries with the shortest healthy lifespans are poor and emit very little CO₂. This pattern supports the idea that economic and health system development are the dominant factors for healthy life expectancy, not CO₂ levels (Deaton, 2003). If anything, the map suggests an injustice: those who have contributed least to emissions (and climate change) often have the lowest life expectancies (Watts et al., 2023). It also implies that reducing emissions in high-HALE countries (for sustainability) should be feasible without sacrificing their hard-won health outcomes, given their strong health systems. In summary, Perspective 2 finds that life expectancy is more strongly tied to wealth and public health investments than to carbon emissions. Policies focusing on improving healthcare, nutrition, and the environment together could continue to raise healthy life expectancy while also cutting unnecessary CO₂ emissions.

Summary:#

This data story set out to explore the relationship between CO₂ emissions and healthy life expectancy across countries from 2000 to 2021. By examining two contrasting perspectives, we aimed to understand whether higher emissions are associated with worse health outcomes or whether emissions are simply a byproduct of economic growth and improved living standards. The first perspective suggested that emissions negatively affect health through air pollution and environmental stress, potentially reducing healthy years. However, while some case studies like the U.S. vs France or India revealed possible health costs linked to emissions, the global evidence did not point to a clear or consistent pattern.

The second perspective focused on development. Countries with higher CO₂ emissions often had longer healthy life expectancies, likely due to better infrastructure, healthcare, and wealth. Visualizations showed that many countries gained both in emissions and health over time, with no simple trade-off between pollution and health.

Our goal was not to make sweeping claims so in conclusion, the relationship between emissions and health is complex and shaped by many overlapping factors. Further research is needed to understand long-term effects, especially those related to climate change and how countries can balance sustainability with continued health improvements.

References:#